﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;

namespace senac.login.alterarSenha
{
    public partial class NovaSenha : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {

            }

            //Verificando o login do usuário
            if (Session["chapa"] == null)
            {
                Response.Redirect("../mensagens_sistema.aspx?id_mensagem=2");
            }
        }

        protected void Login_Click(object sender, EventArgs e)
        {
            try
            {
                if (!ValidacaoLadoServidor())
                    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Atenção!", "alert('Verifique as informações passadas nos campos.')", true);
                else
                {
                    string chapa = DAO.Instance.ConsultarSenhaAtual(Session["chapa"].ToString(), this.txtbSenhaAtual.Text);
                    //string chapa = DAO.Instance.ConsultarSenhaAtual("14152", this.txtbSenhaAtual.Text);

                    if (string.IsNullOrEmpty(chapa))
                        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Atenção!", "alert('A senha atual não está correta.')", true);
                    else
                    {
                        DAO.Instance.UpdateSenha(Session["chapa"].ToString(), this.txtbNovaSenha.Text);
                        //DAO.Instance.UpdateSenha("14152", this.txtbNovaSenha.Text);

                        ScriptManager.RegisterStartupScript(this, typeof(Page), "redirect", "alert('Sua senha foi alterada com sucesso!'); window.location='Entrada.aspx';", true);
                        //Response.Redirect("Entrada.aspx");
                    }
                }
            }
            catch(Exception exc)
            {
                throw new Exception("Exception-> " + exc.Message);
            }
        }

        /// <summary>
        /// Responsável por validar os dados informados no formulário de alterar senha
        /// </summary>
        /// <returns>Verdadeiro ou falso</returns>
        private bool ValidacaoLadoServidor()
        {
            //Verificando se algum campo veio vazio
            if (string.IsNullOrEmpty(this.txtbSenhaAtual.Text) || string.IsNullOrEmpty(this.txtbNovaSenha.Text) || string.IsNullOrEmpty(this.txtbConfirmarSenha.Text))
                return false;
            //Verificando se a nova senha está igual a confirmar senha
            else if (!this.txtbNovaSenha.Text.Equals(this.txtbConfirmarSenha.Text))
                return false;
            //Verificando se a senha atual é igual a nova senha
            else if (this.txtbSenhaAtual.Text.Equals(this.txtbNovaSenha.Text))
                return false;

            return true;
        }

    }

    public class DAO
    {
        #region Singleton
        private static DAO instance;

        private DAO() { }

        public static DAO Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new DAO();
                }
                return instance;
            }
        }
        #endregion

        /// <summary>
        /// Responsável por verificar no banco de dados se a senha atual confere com a do usuário logado
        /// </summary>
        /// <param name="codChapa">Identificação do usuário no banco de dados</param>
        /// <param name="senhaAtual">Senha atual ser verificada no banco</param>
        /// <returns>O código da chapa do usuário registrado no banco de dados</returns>
        public string ConsultarSenhaAtual(string chapa, string senhaAtual)
        {
            //Montando consulta para ser executada no banco de dados
            SqlCommand command = new SqlCommand("SELECT chapa FROM usuarios WHERE chapa = @chapa AND senha = @senhaAtual");
            command.Parameters.Add(new SqlParameter("chapa", chapa));
            command.Parameters.Add(new SqlParameter("senhaAtual", senhaAtual));

            try
            {
                DataTable dt = executarQuery(command);

                if (dt != null && dt.Rows.Count > 0)
                    return dt.Rows[0][0].ToString();

                return string.Empty;
            }
            catch { throw; }
        }

        /// <summary>
        /// Responsável por atualizar a senha do usuário com a nova informada
        /// </summary>
        /// <param name="codChapa">Identificação do usuário no banco de dados</param>
        /// <param name="novaSenha">Nova senha para ser cadastrada</param>
        public void UpdateSenha(string chapa, string novaSenha)
        {
            try
            {
                //Montando consulta para ser executada no banco de dados
                SqlCommand command = new SqlCommand("UPDATE usuarios SET senha = @novaSenha, Primeiro_Acesso_Na_Intranet = 'n' WHERE chapa = @chapa");
                command.Parameters.Add(new SqlParameter("chapa", chapa));
                command.Parameters.Add(new SqlParameter("novaSenha", novaSenha));

                executarQuery(command);
            }
            catch { throw; }
        }

        /// <summary>
        /// Responsável por retornar a string de conexão com o banco
        /// </summary>
        private string strConn
        {
            get { return @"Data Source=sql;Initial Catalog=Intranet;Persist Security Info=True;User ID=intrausuario;Password=usr674532#5"; }
        }

        /// <summary>
        /// Método para efetuar a conexão com o banco de dados e executar a query passada por parâmetro
        /// </summary>
        /// <param name="command">Command com a query(e os parâmetros) a ser executada no banco de dados</param>
        /// <returns>Tabela com as informações recuperadas</returns>
        private DataTable executarQuery(SqlCommand command)
        {
            DataTable dt = new DataTable();
            SqlConnection conn = new SqlConnection(strConn);

            try
            {
                command.Connection = conn;
                SqlDataAdapter adapter = new SqlDataAdapter(command);
                adapter.Fill(dt);
            }
            catch { throw; }
            finally { conn.Close(); }

            return dt;
        }
    }
}